/*
 * Implementação dos métodos da classes Sprite.
 */

#include <SDL/SDL_image.h>
#include <SDL/SDL_rotozoom.h>
#include "Sprite.h"
#include "core/utils.h"

using namespace utils;
using std::string;


/*
 * Carrega a surface de base, a que será rotacionada e o retângulo, que pode ter
 * X e Y quaisquer.
 */
Sprite::Sprite(const std::string& file, SDL_Rect* base) :
rect(makeRect(0, 0, 0, 0)), rectBase(base), angle(0.0),
surf( IMG_Load(file.c_str()) ), surfBase( IMG_Load(file.c_str()) ) {
	rect.h = surfBase->h;
	rect.w = surfBase->w;
}


/*
 * O Destrutor precisa liberar as duas surfaces.
 */
Sprite::~Sprite() {
	SDL_FreeSurface(surf);
	SDL_FreeSurface(surfBase);
}


/*
 * Calcula a posição em que essa sprite deve ser blitada de acordo com o
 * retângulo que representa o centro da tela visível. Depois cola essa sprite na
 * tela.
 */
void Sprite::render(SDL_Surface* screen) {
	rect.x = rectBase->x - rectCenter->x + VIDEO_WIDTH/2 - surf->w/2;
	rect.y = rectBase->y - rectCenter->y + VIDEO_HEIGHT/2 - surf->h/2;
	SDL_BlitSurface(surf, NULL, screen, &rect);
}


/*
 * Reconstrói a surface a ser blitada, rotacionando a surface de base.
 */
Sprite& Sprite::rotate(double angle) {
	this->angle = angle;
	SDL_FreeSurface(surf);
	surf = rotozoomSurface(surfBase, angle, 1, 0);
	return *this;
}

